﻿// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

//配置部分
int yourdata = 0;
char ModuleName[MAX_PATH] = "Client Sample";
BOOL IsOn = FALSE;
BYTE KeyCode = 0xFF;
BYTE ReloadKeyCode = 0xFF;

void LoadCFG()
{
	IsOn = cfgload::GetModuleIsOn(ModuleName);
	KeyCode = cfgload::GetModuleHotKey(ModuleName);
	ReloadKeyCode = cfgload::GetModuleHotKey("Reload cfg");
}

void Trigger()
{
	CHAR info[MAX_PATH] = "";
	cfgload::GetModuleDescription(ModuleName, info, MAX_PATH);
	if (IsOn)
	{
		IsOn = FALSE;
		D2Functions::GameInfof("$$9Module %s $$0:$$1OFF", info);
	}
	else
	{
		IsOn = TRUE;
		D2Functions::GameInfof("$$9Module %s $$0:$$2ON", info);
	}
}

extern "C"
{
	void __declspec(dllexport) DllGameLoop(GamePub* pGamePub)
	{
		//游戏内的GameLoop
	}

	void __declspec(dllexport) DllGameRunOnce(GamePub* pGamePub)
	{
		LoadCFG();
		//进入房间运行一次
	}

	void __declspec(dllexport)DllGameEnd(GamePub* pGamePub)
	{
		//退出房间时运行一次
	}

	void __declspec(dllexport)DllGamePacketReceived(BYTE* aPacket, DWORD aLength, GamePub* pGamePub)
	{
		//在游戏接受到数据包时处理
	}

	void __declspec(dllexport)DllGameCommandLine(char** argv, int argc, GamePub* pGamePub)
	{
		//游戏内发送.文本处理
	}

	void __declspec(dllexport)DllGamePacketSent(BYTE* aPacket, DWORD aLength, GamePub* pGamePub)
	{
		//在游戏发送数据包时处理
	}

	void __declspec(dllexport)DllGameKeyDown(BYTE keycode, BYTE repeat, GamePub* pGamePub)
	{
		//游戏内按键处理
		if (keycode == 0xFF)return;

		if (keycode == ReloadKeyCode)
		{
			IsOn = FALSE;
			LoadCFG();
		}
		else if (keycode == KeyCode)
		{
			Trigger();
		}
		if (keycode == VK_NUMPAD0)
		{

		}
		//添加处理的代码
	}

	void __declspec(dllexport)DllGameDrawClient(GamePub* pGamePub)
	{
		//你可以画一个小猪佩奇
	}

	void __declspec(dllexport)DllGameLoopThread(GamePub* pGamePub)
	{
		//这个比较准时 每0.01秒运行一次
	}
}

int tst()
{
	Py_Initialize();

	// 判断初始化是否成功  
	if (!Py_IsInitialized())
	{
		// 关闭 Python 脚本解释器，释放内存。
		Py_Finalize();
		return -1;
	}
	PyObject* pModule = NULL;
	PyObject* pFunc = NULL;
	PyObject* pArg = NULL;

	// 添加模块路径
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('F:\\CpyD2\\CpyD2\\pytest')");

	// 导入模块
	pModule = PyImport_ImportModule("pytest");
	if (!pModule) // 检查模块是否导入成功
	{
		Py_Finalize();
		return -1;
	}
	else
	{
		// 导入函数
		pFunc = PyObject_GetAttrString(pModule, "run"); //python 脚本里的函数名
		if (!pFunc) // 检查函数是否导入成功
		{
			//cout << "Function import failed ..." << endl;
			Py_Finalize(); 
			return -1;
		}

		//C++类型转换为python类型
		PyObject* pParams = Py_BuildValue("(s)", "Michael");

		char* result;

		pArg = PyEval_CallObject(pFunc, pParams); // 调用函数
		   //获取结果，python类型转换为C++类型。
		PyArg_Parse(pArg, "s", &result);

		//cout << result << endl;
	}

	Py_Finalize();

	return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		tst();
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}